﻿// Thủ tục kiểm tra vị trí các Module được thiết lập của người dùng
// Đưa ra danh sách các mã tham chiếu của Module trong các cột tương ứng.
// Params
// + displayregion : Mã tham chiếu của cột xuất phát (các Module se bắt đầu tìm kiếm từ cột này)
// + positionGrid : Mã tham chiếu của biến lưu trữ vị trí của các Module
// + columnLevelArray : Mã tham chiếu của biến lưu trữ mức của các cột
function CheckPosition(displayregion, positionGrid, columnLevelArray)
{
	var arrColumnContainers;
	
	// Nếu cột xuất phát không tồn tại, kết thúc thủ tục
	if(displayregion==null)
		return false;	
	
	// Kiểm tra xem có khả năng lấy thông tin về các phần tử bên trong cột xuất phát không
	if (displayregion.getElementsByTagName)
	{
		// Lấy danh sách tất cả các cột (bao gồm cột cha, cột con, và các cột bên trong Module)
		arrColumnContainers = displayregion.getElementsByTagName("TD");
		
		if (arrColumnContainers == null) return false;
		positionGrid.value = "";
		columnLevelArray.value = "";
		
		// Duyệt danh sách các cột đã lấy được
		for (var intColumnCount = 0; intColumnCount < arrColumnContainers.length; intColumnCount++)
		{
			// Chỉ lấy các cột có dạng "Cell" + Mã tham chiếu của cột
			if (arrColumnContainers[intColumnCount].id != null && arrColumnContainers[intColumnCount].id.indexOf("Cell") == 0)
			{
				// Khai báo biến lưu trữ cột đang xét
				var objColumn = arrColumnContainers[intColumnCount];
				
				if (objColumn.childNodes != null && objColumn.childNodes.length > 0)
				{
					// Biến lưu trữ số lượng Snap (Khung hiển thị Module) thật sự của một cột (không tính các Snap con)
					var _intSnapsOfCurrentColumn = 0;
					// Mảng lưu danh sách các Snap của cột đang xét
					var arrSnapList = objColumn.childNodes;
					// Lấy mã tham chiếu của cột
					var strColumnRef = objColumn.id.substr(4);
					while(strColumnRef.indexOf("_") > 0)
					{
						strColumnRef = strColumnRef.replace("_", "-");
					}
					// Ghép mã tham chiếu của cột vào chuỗi kết quả
					positionGrid.value += positionGrid.value != '' ? '@' : '';
					positionGrid.value += strColumnRef + '$';
					//positionGrid.value += strColumnRef + '$<br>';
					
					// Duyệt danh sách Snap của cột đang xét
					for (var intSnapCount = 0; intSnapCount < arrSnapList.length; intSnapCount++)
					{
						if (arrSnapList[intSnapCount].id != null)
						{
							// Khai báo biến lưu Snap đang xét
							var objSnap = arrSnapList[intSnapCount];
							// Tìm vị trí từ 'tab_' trong mã tham chiếu của Snap
							var intTabTracePos = objSnap.id.indexOf("tab_");
							// Tìm vị trí từ '_div' trong mã tham chiếu của Snap
							var intDivTracePos = objSnap.id.indexOf("_div");							
							// Snap là hợp lệ nếu Snap có mã tham chiếu bắt đầu bằng Tab_ và kết thúc bằng _div							
							if (intTabTracePos == 0 && intDivTracePos == (objSnap.id.length - 4))
							{
								// Khai báo biến xác lập Snap đang xét có phải là Snap có chứa Snap con không
								var _blnHasSubSnap = false;
								
								// Kiểm tra xem Snap đang xét có Snap con bên trong hay không
								if (objSnap.getElementsByTagName)
								{	
									// Lấy danh sách các phần tử TD là con của Snap đang xét, các phần tử này có thể là Cột con
									var arrSubSnaps = objSnap.getElementsByTagName("TD");
									if (arrSubSnaps == null)
										_blnHasSubSnap = false;
									else
									{										
										// Duyệt các phần tử TD
										for (var intSubSnapCount = 0; intSubSnapCount < arrSubSnaps.length; intSubSnapCount++)
										{
											if (arrSubSnaps[intSubSnapCount].id != null)
											{
												// Khai báo biến lưu cột con
												var objSubSnap = arrSubSnaps[intSubSnapCount];
												
												// Cột con là hợp lệ nếu tồn tại 1 TD có khóa bắt đầu bằng "Cell"
												if (objSubSnap.id.indexOf("Cell") == 0)
												{
													// Mã tham chiếu của phần tử TD thỏa mãn là 1 Cột con
													// Vậy Snap đang xét có chứa Cột con
													_blnHasSubSnap = true;
													
													// Khai báo biến lưu trữ Level của TD đang xét
													var _intColumnLevel = intSnapCount;
													var _objTableContainer = objSubSnap.parentNode;
													while (_objTableContainer != null && _objTableContainer.nodeName != "TABLE" && _objTableContainer.parentNode != null)
													{
														_objTableContainer = _objTableContainer.parentNode;
													}
													if (_objTableContainer != null && _objTableContainer.nodeName == "TABLE")
													{	
														_intColumnLevel = _objTableContainer.getAttribute("level");
													}
													
													// Lưu lại thông tin của cột con
													// Mã tham chiếu đến cột con
													var strSubColumnLevelRef = GetObjectRefercence(objSubSnap.id.substring(4));
													// Biến lưu level của cột con													
													var strColumnLevelTrace = strSubColumnLevelRef + '#' + _intColumnLevel;
													// Chỉ thêm vào chuỗi kq (chuỗi chứa mức độ các cột) nếu chưa thêm lần nào
													if (columnLevelArray.value.indexOf(strSubColumnLevelRef) < 0)
													{
														if (columnLevelArray.value.length > 0) columnLevelArray.value += '@';
														columnLevelArray.value += strColumnLevelTrace;
													}
												}
											}
										}
									}
								}
		
								// Nếu Snap đang xét có chứa Snap con thì bỏ qua Snap đang xét
								// do mã nếu chứa Snap con thì sẽ không chứa module bên trong
								if (!_blnHasSubSnap)
								{
									// Lấy phần mã tham chiếu của Module nằm bên trong Snap
									var strModuleRef = objSnap.id.substring(intTabTracePos + 4, intDivTracePos);
									
									// Cắt lấy phần mã tham chiếu của Module
									strModuleRef = GetObjectRefercence(strModuleRef);									
									
									// Ghép mã tham chiếu của Module vào chuỗi kết quả
									//positionGrid.value += _intSnapsOfCurrentColumn > 0 ? '~<br>' : '';
									positionGrid.value += _intSnapsOfCurrentColumn > 0 ? '~' : '';
									positionGrid.value += strModuleRef;
									
									// Tăng số lượng Snap thực sự của cột lên 1
									_intSnapsOfCurrentColumn++;
								}
							}
						}
					}
					//positionGrid.value += "<br>-------------------------------------------<br>";
				}
			}
		}
	}
}

function GetObjectRefercence(_strInput)
{
	var _arrReferencePart = _strInput.split('_');
	var _strReference = "";
	if (_arrReferencePart != null && _arrReferencePart.length > 0)
	{
		for (var i = _arrReferencePart.length - 1; i >= 0; i--)
		{			
			if (_arrReferencePart[i] != '' && _arrReferencePart[i].length > 0)
			{
				if (_arrReferencePart[i].indexOf('ctl') < 0)
					_strReference = ((_strReference.length > 0) ? (_arrReferencePart[i] + '_') : _arrReferencePart[i]) + _strReference;
				else
					break;
			}
		}
	}
	while(_strReference.indexOf("_") >= 0)
	{
		_strReference = _strReference.replace("_", "-");
	}
	return _strReference;
}

function Left(str, n){
	if (n <= 0)
	    return "";
	else if (n > String(str).length)
	    return str;
	else
	    return String(str).substring(0,n);
}
function Right(str, n){
    if (n <= 0)
       return "";
    else if (n > String(str).length)
       return str;
    else {
       var iLen = String(str).length;
       return String(str).substring(iLen, iLen - n);
    }
}
